(() => {

  class Animal {
    name: string
    private age: number = 3 // 私有的属性只能在当前类内部访问
    protected sex: string = '男'
    static count = 0

    constructor (name: string) {
      this.name = name
    }

    run (distance: number=0) {
      console.log(this.age)
      console.log(this.name, 'run ', distance)
    }
  }

  class Snake extends Animal {
    run (distance: number=5) {
      // console.log(this.age) // 子类型看不到父类型私有的属性
      console.log(this.sex) // 子类型能看到父类型受保护的属性
      console.log('snake run')
      super.run(distance)
    }
  }

  const a: Animal = new Animal('tt')
  console.log(a.name)
  // console.log(a.age) // 外部不可访问类私有的属性
  // console.log(a.sex) // 外部不可访问类受保护的属性
  
  console.log(Animal.count)

  const obj = {
    // name: 'tom'
    get name () {
      return 
    },
    set name (value) {

    }
  }

  // 抽象类: 不能产生实例
  abstract class Animal2 {
    abstract test () 

    test2 () {
      console.log('test2()')
    }
  }

  // new Animal2()  // error


  // 实现类: 可以创建实例
  class Animal3 extends Animal2 {
    test () {
      console.log('test()')
    }
  }

  new Animal3()

})()